module tb_uart_receiver;
    reg clk_in; 
    // reg rst_n; 
    reg sin;
    wire [7:0] sdata;
    wire data_valid, parity_valid;
    
    uart_receiver uut (
        .clk_in(clk_in),
        // .rst_n(rst_n),
        .sin(sin),
        .sdata(sdata),
        .data_valid(data_valid),
        .parity_valid(parity_valid)
    );
    
    // 50MHz时钟生成
    always #10 clk_in = ~clk_in;
    
    initial begin
        // 初始化
        clk_in = 0;
        sin = 1;
        #100 

        // sin = 1;
        #900
        // 测试正常数据接收
        // $display("=== Testing normal data reception ===");
        send_byte(8'hAC, 1'b1);  // 正确奇校验
        // #8000;
        send_byte(8'hBC, 1'b1);  // 正确奇校验
        #8000;
        
        // // 测试校验错误
        // $display("=== Testing parity error ===");
        send_byte(8'hCC, 1'b0);  // 错误奇校验
        // #1000;

        send_byte(8'hDC, 1'b0);  // 错误奇校验
        #1000;
        
        // $display("=== Test completed ===");
        // #1000 $finish;
    end
    
    task send_byte;
        input [7:0] data;
        input parity_bit;
        integer i;
        begin
            // 起始位
            sin = 0;
            #8680;
            
            // 数据位 (LSB first_n)
            for (i = 0; i < 8; i = i + 1) begin
                sin = data[i];
                #8680;
            end
            
            // 奇校验位
            sin = parity_bit;
            #8680;
            
            // 停止位
            sin = 1;
            #8680;
        end
    endtask
    
    // // 监控输出
    // always @(posedge clk_in) begin
    //     if (data_valid) begin
    //         $display("Time %0t: Data=0x%h, Parity_valid=%b", 
    //                  $time, sdata, parity_valid);
    //     end
    // end
    
endmodule
